/**
 * 分段加密
 * 问题 ： 请求后台传参 需要一个对象，包含中文，同时数据量较大（超过 jsencrypt的限制）
 * 解决 ：对象转 json串转成base64
 *      将base64 分段加密 存储。
 *      后台获取到对应的base64加密数据在进行分段解密，最终合并在转json字符串.再将json字符串转对象
 *
 */
//安装  cnpm i jsencrypt  or npm i jsencrypt
//引入 JSEncrypt
import {JSEncrypt} from "jsencrypt";

//公钥
const publicKeyDef = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoZVnCtN/WZ8WX76+IzNelc+ZvkJLGQ7L9QGQkMA0iLtjt5jJ8+fzCuP1U6rO50Q67PhM5vzFCglALSFVsqGXNm7hrc++kDNhX5sMA0u0gO4L5LsBp5Rb03EGKDT7EBoHiQONw8eorXSniRMutQerhHKMKq03vpm1UuKHwRcaU/wIDAQAB";


// 加密
/**
 * 字符串转base64
 * 记录出现的问题
 * atob()函数用于将一个Base64编码的字符串解码为二进制数据
 * Base64编码字符串只包含A-Z、a-z、0-9、+、/和=这些字符
 * 如果字符串在包含其他的特殊字符就会报错
 * 需要使用window.encodeURIComponent编码再加密
 * @param jsonStr json字符串
 * @returns {string}
 */
export function strToBase64(jsonStr) {
    // 将JSON字符串编码为UTF-8
    // 创建 TextEncoder 对象
    const encoder = new TextEncoder();
    // 调用 encode() 方法将字符串转换为 UTF-8 字节流
    const utf8Bytes = encoder.encode(jsonStr);
    // 转base64
    let base64 = window.btoa(String.fromCharCode.apply(String, utf8Bytes))
    return base64
}

/**
 * base64 转 字符串
 * @param base64
 * @returns {string}
 */
export function base64ToStr(base64) {
    // 将 Base64 字符串解码为字节数组
    let decodedBytes = new Uint8Array(atob(base64).split('').map(char => char.charCodeAt(0)));
    // 将字节数组解码为 UTF-8 编码的字符串
    let decodedString = new TextDecoder().decode(decodedBytes);
    // 将解码后的字符串转为 JSON 对象
    // let jsonObject = JSON.parse(decodedString);
    // console.log('base64串转json字符：', jsonObject);
    return decodedString
}
/**
 * 分段加密
 * @param plaintextBase64 base64 明文 （被加密的字符串）
 * @param fractionalLength 每段的长度（不要太大，否则会加密失败）
 * @param separateSymbol 分隔符号 （后台也要根据对应的分隔符号来分割进行分段解析）
 * @returns {string}
 */
export function segmentedEncryption(plaintextBase64, fractionalLength = 10, separateSymbol = "_", publicKey = publicKeyDef) {
    const encryptedSegments = [];
    const encryptor = new JSEncrypt()
    for (let i = 0; i < plaintextBase64.length; i += fractionalLength) {
        const segment = plaintextBase64.substr(i, fractionalLength);
        // console.log('分段', segment);
        //设置公钥
        encryptor.setPublicKey(publicKey)
        //加密
        const encryptedSegment = encryptor.encrypt(segment);
        // console.log('加密', encryptedSegment);
        encryptedSegments.push(encryptedSegment);
        // const encryptorJM = new JSEncrypt()
        // encryptorJM.setPrivateKey(priority)
        // let jiemi = encryptorJM.decrypt(encryptedSegment)
        // console.log('解密', jiemi);
    }
    return encryptedSegments.join(separateSymbol)
}

export function segmentedEncryptionByPlaintext(plaintext, fractionalLength = 10, separateSymbol = "_", publicKey = publicKeyDef) {
    let base64 = strToBase64(plaintext);
    return segmentedEncryption(base64, fractionalLength, separateSymbol, publicKey);
}




